﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace KSOAPlus
{
    public partial class SuperToExcel : Form
    {
        public SuperToExcel()
        {
            InitializeComponent();
            rightcopy.Text = Common.rightcopy;
        }

        Common Init = new Common();
        MsSqlHelper mssql = new MsSqlHelper();
        ExcelHelper excelSave = new ExcelHelper();
        DataTable dataTable = new DataTable();        

        private void btnquery_Click(object sender, EventArgs e)
        {
            try
            {

                dataTable = null;
                string SqlStr = rTBSql.Text;
                SqlStr = SqlStr.Replace("update", "");
                SqlStr = SqlStr.Replace("drop", "");
                SqlStr = SqlStr.Replace("delete", "");
                SqlStr = SqlStr.Replace("insert", "");
                dataTable = mssql.ExecuteDt(SqlStr);
                for (int i = 0; i < dataTable.Columns.Count; i++)
                {
                    string ColumnName = mssql.GetString("select top 1 rtrim(chnname) chnname  from fldlist where fdname=rtrim('" + dataTable.Columns[i].ToString() + "')");
                    if (!dataTable.Columns.Contains(ColumnName))
                    {
                        dataTable.Columns[i].ColumnName = ColumnName;
                    }
                }    
                dGV.DataSource = dataTable;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btntoexcel_Click(object sender, EventArgs e)
        {              
            try
            {  
                if (dataTable.Rows.Count > 0)
                {
                    SaveFileDialog saveFileDialog = new SaveFileDialog();
                    saveFileDialog.Filter = "Excel工作簿|*.xlsx|Excel 97-2003工作薄|*.xls";
                    saveFileDialog.FileName = "导出";
                    if (saveFileDialog.ShowDialog() == DialogResult.OK)
                    {
                        if (excelSave.GetExcelByDataTable(dataTable, saveFileDialog.FileName))
                        {
                            MessageBox.Show("导出成功！");
                        }
                        else
                        {
                            MessageBox.Show("导出失败！");
                        }
                    }
                }
                else
                {
                    MessageBox.Show("导出失败！请先查询出要导出的数据！");
                }
            }
            catch (Exception ex)
            {
                Init.WriteLog(ex.ToString(), true);
                MessageBox.Show(ex.Message);
            }            
        }

        public void DataGridViewEnableCopy(DataGridView p_Data)
        {
            Clipboard.SetData(DataFormats.Text, p_Data.GetClipboardContent());
        }

        public void DataGirdViewCellPaste1(DataGridView p_Data)
        {
            try
            {
                // 获取剪切板的内容，并按行分割 
                string pasteText = Clipboard.GetText();
                if (string.IsNullOrEmpty(pasteText))
                    return;
                string[] lines = pasteText.Split(new char[] { ' ', ' ' });
                foreach (string line in lines)
                {
                    if (string.IsNullOrEmpty(line.Trim()))
                        continue;
                    // 按 Tab 分割数据 
                    string[] vals = line.Split(' ');
                    p_Data.Rows.Add(vals);
                }
            }
            catch
            {
                // 不处理 
            }
        }
        public void DataGridViewEnablePaste(DataGridView p_Data)
        {
            if (p_Data == null)
                return;
            p_Data.KeyDown += new KeyEventHandler(dGV_KeyDown);
        }


        private void dGV_KeyDown(object sender, KeyEventArgs e)
        {

        }


        /// <summary>
        /// DataGridView的KeyDown事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dgv_KeyDown(object sender, KeyEventArgs e)
        {
            //判断是否按下：Ctrl+V
            if (Control.ModifierKeys == Keys.Control && e.KeyCode == Keys.V)
            {
                //对象不为null，且对象为DataGridView类型
                if (sender != null && sender.GetType() == typeof(DataGridView))
                    DataGirdViewCellPaste((DataGridView)sender);//调用黏贴方法
            }
        }
        /// <summary>
        /// 向DataGridView控件粘贴数据
        /// </summary>
        public void DataGirdViewCellPaste(DataGridView dgv)
        {
            if (dgv.CurrentCell == null)//判断当前单元格已选中，复制黏贴单元格初始位置
                return;
            int insertRowIndex = dgv.CurrentCell.RowIndex;//获取当前单元格行索引,打印单元格内容调用
            int insertColIndex = dgv.CurrentCell.ColumnIndex;//获取当前单元格列索引,打印单元格内容调用

            string pasteText = Clipboard.GetText();//获取当前剪切板的内容（黏贴内容必须是表格形式）
            if (string.IsNullOrEmpty(pasteText))//剪贴板内容不为空
                return;

            #region 获取剪贴板内容的行、列数
            //剪切板内容：21\t\t\r\n11\t12\r\n（\t:表示空格；\r\n:表示换行）
            #region 获取行数
            char[] c = pasteText.ToCharArray();//化整为零，将字符串转化成字符数组，逐个遍历
            int RowCount = 0;//行数初始为零
            for (int i = 0; i < c.Length; i++)
            {
                if (c[i] == '\n')//根据"\r\n"中的'\n'获取换行次数，从而获取总行数
                {
                    RowCount++;
                }
            }
            //判断复制范围是否在最大行范围内：（黏贴内容行数-1）+（当前单元格行索引值+1） > 表格总行数
            //(黏贴内容行数 -1）:因为有一行刚好黏贴在当前行
            if (RowCount + insertRowIndex > dgv.RowCount)
            {
                MessageBox.Show("粘贴的行数不正确");
                return;
            }
            #endregion

            #region 获取列数
            string[] s = pasteText.Split(new char[] { '\r', '\n' });//根据'/r'、'/n'，把数据分为行单位内容
            string[] Col = s[0].Split('\t');//根据'\t',获取每行单元格数，也就是列数
            int ColCount = Col.Length;//列数
            //判断复制范围是否在最列行范围内：（黏贴内容列数-1）+（当前单元格列索引值+1） > 表格总列数
            if (ColCount + insertColIndex > dgv.ColumnCount)
            {
                MessageBox.Show("粘贴的列数不正确");
                return;
            }
            #endregion

            #endregion

            #region 黏贴单元格内容
            List<string> listRow = new List<string>();//声明集合，存储行单位内容
            for (int i = 0; i < s.Length; i++)
            {
                if (s[i] != "")//存储不为null的行单位内容
                {
                    listRow.Add(s[i]);
                }
            }
            //黏贴单元格内容到表格上
            for (int iR = 0; iR < RowCount; iR++)
            {
                for (int iC = 0; iC < ColCount; iC++)
                {
                    //注意黏贴单元格索引位置：在当前单元格的初始索引上叠加
                    dgv[iC + insertColIndex, iR + insertRowIndex].Value = listRow[iR].Split('\t')[iC];
                    // listRow[iR]:第[iR+1]行单元格内容
                    // listRow[iR].Split('\t')：把第[iR+1]行单元格内容划分
                    // listRow[iR].Split('\t')[iC]:提取第[iR+1]行的第[iC+1]个单元格内容
                }
            }
            #endregion
        }
 
    }
}

